package com.imooc.coupon.vo;

import com.imooc.coupon.constant.PeriodType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils;

/**
 * <h1>优惠卷规则对象定义</h1>
 * @Author: crowsjian
 * @Date: 2020/6/1 22:48
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TemplateRule {
    /*优惠卷过期规则*/
    private Expiration expiration;
    /*折扣*/
    private Discount discount;
    /*每个人最多领几张的限制*/
    private Integer limitation;
    /*适用范围：地域 + 商品类型*/
    private Usage usage;
    /*权重（可以和哪些优惠卷叠加使用，同一类的优惠卷一定不能叠加）：list[]， 优惠卷的唯一编码
    * */
    private String weight;

    /**
     * <h2>校验功能</h2>
     * @return
     */
    public boolean validate(){
        return expiration.validate() && discount.validate()
                && limitation > 0 && usage.validate()
                && StringUtils.isNotEmpty(weight);
    }

    /**
     * <h2>有效期规则</h2>
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Expiration{
        /*有效期规则 对应 PeriodType 的 code 字段*/
        private Integer period;
        /*有效期间隔：只对变动性有效期有效*/
        private Integer gap;
        /*优惠卷模板的有效日期，两类规则都有效*/
        private Long deadline;
        boolean validate(){
            //最简化校验
            return null != PeriodType.of(period) && gap > 0 && deadline > 0;
        }
    }

    /**
     * <h2>折扣</h2>
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Discount{
        /*额度：（满减20），折扣（85），立减（10）*/
        private Integer quota;
        /*基准，需要满多少才可用*/
        private Integer base;
        boolean validate(){
            return quota > 0 && base > 0;
        }
    }

    /**
     * <h2>使用范围</h2>
     */
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Usage{
        /*省份*/
        private String province;
        /*城市*/
        private String city;
        /*商品类型，list[文娱，生鲜，家居，全品类]*/
        private String goodsType;
        boolean validate(){
            return StringUtils.isNotEmpty(province)
                    && StringUtils.isNotEmpty(city)
                    && StringUtils.isNotEmpty(goodsType);
        }
    }
}
